﻿#pragma once
#include <QObject>
#include <QVariantHash>
#include <QJsonObject>

class FavoriteAttributes;

class AttributeGroup: public QObject
{
	Q_OBJECT
	Q_PROPERTY(QJsonObject values READ values CONSTANT)
public:
	explicit AttributeGroup(QObject* parent = nullptr) ;
	explicit AttributeGroup(FavoriteAttributes* favorite, QObject* parent = nullptr) ;
	void updateLast(QJsonObject const& valueObj);
	QJsonObject const values() const;
signals:
	void registerUpdated(int address, int bit = -1, bool bitValue = false);
protected:
	//************************************
	// 函数名:		updateRegister
	// 函数全称:	AttributeGroup::updateRegister
	// 权限:		virtual protected 
	// 返回值:		void
	// 修饰符:		
	// 参数:		int address
	// 参数:		quint16 value
	// ****	                                                                                      /-->是--> 仅更新收藏属性，中断
	// ****	                                                                                     /
	// 描述:		取得数据-->是否存在于收藏组-->更新m_favorite->update-->是否仅存在收藏属性中--                                                                                                        /--是-->发送每一位更新信号
	// ****                                       此步已经更新收藏属性组，无论是两者还是仅收藏   \                                                               /--是-->插入--------------->是否按位解--
	// ****                                       仅通用属性组，跳过此步直接updateRegister        \-->否，存在于两者或仅通用属性中-->updateRegister--是否新数据--                                        \--否-->发送寄存器更新信号
	// ****                                                                                                                                                      \                          /-->是否按位解-->是-->updateBits
	// ****                                                                                                                                                       \                        /
	// ****                                                                                                                                                        \--否-->更新通用属性组--
	// ****                                                                                                                                                                                \-->否-->仅更新寄存器值
	//************************************
	virtual void updateRegister(QString const& address, quint16 value);
	virtual bool updateBits(QStringView address, quint16 value);
private:
	FavoriteAttributes* m_favorite = nullptr;
	QVariantHash m_lastDataMap;
	std::vector<QStringView> const m_parseOfBits;
};
